package util

import (
	"fmt"
	"math/rand"
	"time"

	"github.com/bwmarrin/snowflake"

	_const "aicloud.cn/aicloud-operate/pkg/util/const"
)

func GenerateSnowId() string {
	//rand.Seed(time.Now().UnixNano())
	n := rand.Intn(200000)
	node, _ := snowflake.NewNode(1)
	return fmt.Sprintf("%d", node.Generate().Int64()+int64(n))
}

func ParseTime(timeStr string) (time.Time, error) {
	timeObj, err := time.Parse(_const.TIMEFORMAT, timeStr)
	if err != nil {
		return time.Time{}, err
	}
	return timeObj.In(time.Local), nil
}

// GetExtraElements 去除第一个数组相关的元素
func GetExtraElements[T comparable](arr1, arr2 []T) []T {
	// 创建一个 map 来存储第一个数组中的元素，以便快速查找
	existingElements := make(map[T]struct{})
	var result []T

	// 将第一个数组的所有元素添加到 map 中
	for _, item := range arr1 {
		existingElements[item] = struct{}{}
	}

	// 遍历第二个数组，添加那些不在第一个数组中的元素到结果切片
	for _, item := range arr2 {
		if _, exists := existingElements[item]; !exists {
			result = append(result, item)
		}
	}
	return result
}

// ElementsContains arr1是否包含arr2的全部元素
func ElementsContains[T comparable](arr1, arr2 []T) bool {
	existingElements := make(map[T]struct{})
	var (
		contains = true
	)
	for _, item := range arr1 {
		existingElements[item] = struct{}{}
	}
	for _, element := range arr2 {
		if _, ok := existingElements[element]; !ok {
			contains = false
			break
		}
	}
	return contains
}
